参考文章
http://librajt.github.io/2013/08/04/handle-excel-file-with-nodejs/
对比了 ExcelJS ,
https://github.com/guyonroche/exceljs#create-a-workbook
node-xlsx,https://github.com/mgcrea/node-xlsx
等 nodejs 等现有组件,决定使用node-xlsx。
node-xlsx 基于现有前端强大组件 js-xlsx, https://github.com/SheetJS/js-xlsx
简单使用例子:
- var express = require('express');
- var router = express.Router();
- var xlsx = require('node-xlsx');
- var fs = require('fs');
-
- /* GET import excel test. */
- router.get('/importExcel', function(req, res, next) {
- var filename='./public/test.xlsx';
- console.error(filename);
- // read from a file
- var obj = xlsx.parse(filename);
- console.log(JSON.stringify(obj));
-
- res.send('import successfully!');
- });
- /* GET export excel test. */
- router.get('/exportExcel', function(req, res, next) {
- // write
- var data = [[1,2,3],[true, false, null, 'sheetjs'],['foo','bar',new Date('2014-02-19T14:30Z'), '0.3'], ['baz', null, 'qux']];
- var buffer = xlsx.build([{name: "mySheetName", data: data}]);
- fs.writeFileSync('b.xlsx', buffer, 'binary');
- res.send('export successfully!');
-
- });
补充:
文件上传操作可以选择以下两种
fs
https://github.com/jprichardson/node-fs-extra
formidable
https://github.com/felixge/node-formidable
上传参考代码1: http://www.tuicool.com/articles/F7JrMjj
https://cnodejs.org/topic/4f40a4dc0feaaa4424081758
上传文件 (记得创建上传文件的目录,例如public/upload )
routes/test.js
- var formidable = require('formidable');
- var http = require('http');
- var util = require('util');
- var express = require('express');
- var fs = require('fs');
- var path = require('path');
- var favicon = require('serve-favicon');
- var bodyParser = require('body-parser');
-
- var app = express();
- var server = http.createServer(app);
-
- server.listen(3000);
-
- app.set('views', '/views');
- //app.use(favicon('/public/favicon.ico'));
- app.use(bodyParser());
- app.use('/public',express.static(path.join(__dirname, 'public')));
-
-
- app.get('/',function(req, res) {
-
- res.writeHead(200, {'content-type': 'text/html'});
- res.end(
- '<form action="/upload" enctype="multipart/form-data" method="post">'+
- '<input type="text" name="title"><br>'+
- '<input type="file" name="upload" multiple="multiple"><br>'+
- '<input type="submit" value="Upload">'+
- '</form>'
- );
- });
-
- app.post('/upload', function(req,res) {
-
- console.log(" ########## POST /upload ####### ");
- var fileTypeError = false;
- var target_path = __dirname+"/upload";
- var form = new formidable.IncomingForm();
- form.encoding = 'utf-8';
- form.keepExtensions = true;
- form.maxFieldsSize = 10 * 1024 * 1024;
- form.uploadDir = target_path;
-
- var fields = [];
- var files = [];
-
- form.on('field', function (field, value) {
- fields.push([field, value]);
- });
- form.on('file', function (field, file) {
- console.log('upload file: ' + file.name);
- //判断文件类型是否是xlsx
- if (file.type != 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {
- fileTypeError = true;
- }
- files.push([field, file]);
- });
-
- form.on('end', function () {
-
- //遍历上传文件
- var fileName = '';
- var obj = '';
- var folder_exists = fs.existsSync(target_path);
- if (folder_exists) {
- var dirList = fs.readdirSync(target_path);
- dirList.forEach(function (item) {
- if (!fs.statSync(target_path + '/' + item).isDirectory()) {
- console.log('parse item:' + target_path + '/' + item);
- fileName = target_path + '/' + item;
- if (!fileTypeError) {
- //解析excel
- obj = xlsx.parse(fileName);
- console.log(JSON.stringify(obj));
- //insert into DB
- //todo
- res.send({"rtnCode": "0", "rtnInfo": "成功导入数据"});
- } else {
- res.send({"rtnCode": "1", "rtnInfo": "文件格式不正确"});
- }
- //delete file
- fs.unlinkSync(fileName);
-
- }
- });
- }else{
- res.send({"rtnCode": "1", "rtnInfo": "系统错误"});
- }
-
- });
- form.on('error', function(err) {
- res.send({"rtnCode": "1", "rtnInfo": "上传出错"});
- });
- form.on('aborted', function() {
- res.send({"rtnCode": "1", "rtnInfo": "放弃上传"});
- });
- form.parse(req);
-
-
- });
其他参考://返回上传进度
- form.on('progress', function(bytesReceived, bytesExpected) {
- var progress = {
- type: 'progress',
- bytesReceived: bytesReceived,
- bytesExpected: bytesExpected
- };
-
- socket.broadcast(JSON.stringify(progress));
- });